package reflect;

import java.lang.reflect.Method;

/**
 * 通过反射机制访问类的私有成员
 * 暴力反射
 */
public class ReflectDemo7 {
    public static void main(String[] args) throws Exception {
        /*
        Person p = new Person();//创建一个对象
        p.heHe();//编译错误. 普通方式无法访问私有方
         */

        Class cls =Class.forName("reflect.Person");//获取类对象
        Object obj = cls.newInstance();//创建对象相当于 Person p = new Person();

        /*
         getMethod()和getMethods();
         获取该类中的公开方法, 包括从超类继承的

         getDeclaredMethod()和getDeclaredMethods();
         获取该类中的所有方法, 包括私有的, 但不包括从超类继承的
         */

        //Method method = cls.getMethod("heHe");//获取方法对象, 但无法访问私有方法
        Method method = cls.getDeclaredMethod("heHe");//获取方法对象, 暴力反射可以访问和调用私有方法,
        method.setAccessible(true);//强制打开访问权限
        method.invoke(obj);//调用heHe私有方法
        method.setAccessible(false);//关闭访问权限

    }
}
